#include "../../include/api/managerTask.h"
#include "../../include/tool/configManage.h"
//#include <thread>
#include <iostream>
#include <mutex>

/********************************************************************
 * @author: tianxiaohuahua
 * @date: 23.8
 * @description: C_managerTask 构造函数 创建管理类
 * @input: void 
 * @return: void 
*******************************************************************/
C_managerTask::C_managerTask()
{
    g_CconfigManage = new C_configManage();
    p_CdtuApiTask = NULL;
    p_CgnssApiTask = NULL;
    p_CmoveApiTask = NULL;
}

C_managerTask::~C_managerTask()
{
///指针释放，普通指针需要手动释放
    delete p_CdtuApiTask ;
    p_CdtuApiTask = NULL;

    delete p_CgnssApiTask ;
    p_CgnssApiTask = NULL;

    delete p_CmoveApiTask ;
    p_CmoveApiTask = NULL;
}

/********************************************************************
 * @author: tianxiaohuahua
 * @date: 23.8
 * @description: initManager管理类
 * @input: void 
 * @return: void 
*******************************************************************/
void C_managerTask::initManager(void)
{
    g_CconfigManage->getAllConfig("/home/firefly/code/mower_drives/config/config.json");
    // 单片机部分初始化
    if(g_CconfigManage->C_config_set.config_driver_en.config_singlechip_en){
        p_CmoveApiTask = new C_moveApi();
        if(NULL == p_CmoveApiTask) {
            //创建对象失败
        }
        else{
            p_CmoveApiTask->initTask(g_CconfigManage->C_config_set.config_driver.config_singchip);
            //C_baseTask *p_CbaseObj = p_CdtuApiTask->getBaseTaskObj();
            g_CbaseManageTask.addThreadList(p_CmoveApiTask);
        }
    }
    // RTK GNSS通信部分初始化
    if(g_CconfigManage->C_config_set.config_driver_en.config_gnss_en){
        p_CgnssApiTask = new C_gnssApi();
        if(NULL == p_CgnssApiTask) {
            //创建对象失败
        }
        else{
            p_CgnssApiTask->initTask(g_CconfigManage->C_config_set.config_driver.config_gnss);
            //C_baseTask *p_CbaseObj = p_CdtuApiTask->getBaseTaskObj();
            g_CbaseManageTask.addThreadList(p_CgnssApiTask);
            //std::thread p_thread_dtu = std::thread(p_CgnssApiTask->runLoopTask, this);
        }
    }
    // 无线数传模组初始化
    if(g_CconfigManage->C_config_set.config_driver_en.config_dtu_en){
        p_CdtuApiTask = new C_dtuApi();
        if(NULL == p_CdtuApiTask) {
            //创建对象失败
        }
        else {
            p_CdtuApiTask->initTask(g_CconfigManage->C_config_set.config_driver.config_dtu);
            //C_baseTask *p_CbaseObj = p_CdtuApiTask->getBaseTaskObj();//这句理解有问题。 C_baseTask *p_CbaseObj = p_CdtuApiTask;学习下多态
            g_CbaseManageTask.addThreadList(p_CdtuApiTask);
        }
    }
    // 启动IMU模组的初始化
    if(g_CconfigManage->C_config_set.config_driver_en.config_imu_en){
        p_CimuApiTask = new C_imuApi();
        if(NULL == p_CimuApiTask) {
            //创建对象失败
        }
        else {
            p_CimuApiTask->initTask(g_CconfigManage->C_config_set.config_driver.config_imu);
            //C_baseTask *p_CbaseObj = p_CdtuApiTask->getBaseTaskObj();//这句理解有问题。 C_baseTask *p_CbaseObj = p_CdtuApiTask;学习下多态
            g_CbaseManageTask.addThreadList(p_CimuApiTask);
        }
    }
}

/********************************************************************
 * @author: tianxiaohuahua
 * @date: 23.8
 * @description: setAllTaskStart 启动所有的任务
 * @input: void 
 * @return: void 
*******************************************************************/
void C_managerTask::setAllTaskStart(void)
{
    // 对全部的任务循环启动
    g_CbaseManageTask.startAllThread();
}

/********************************************************************
 * @author: tianxiaohuahua
 * @date: 23.8
 * @description: setThreadMonitor 监控线程，监控其他的线程的运行情况
 * @input: void 
 * @return: void 
*******************************************************************/
void C_managerTask::setThreadMonitor(void)
{
    while(1) { // 主线程任务
        usleep(1000000);
        //printf("main task\r\n");
    }

}
